package com.zaijiansunwukong.gen.util;

import freemarker.template.*;

import java.io.*;
import java.util.Locale;
import java.util.Map;

public class FreemarkerUtils {

	private static Configuration cfg = null;

	/**
	 * 获取freemarker的配置 freemarker本身支持classpath,目录和从ServletContext获取.
	 *
	 * @return 返回Configuration对象
	 */
	private static Configuration getConfiguration() {
		if (null == cfg) {
			cfg = new Configuration();
			// 这里有三种方式读取
			// （一个文件目录）
			// cfg.setDirectoryForTemplateLoading(new File("codegen"));
			//classpath下的一个目录（读取jar文件）
//			cfg.setClassForTemplateLoading(FreemarkerUtils.class,"/templates");
			// 相对web的根路径来说 根目录
//			cfg.setServletContextForTemplateLoading(
//					ServletActionContext.getServletContext(), "/WEB-INF/templates");
			try {
//				cfg.setDirectoryForTemplateLoading(new File("codegen"));
//				cfg.setDirectoryForTemplateLoading(new File("d:/templates/codegen"));// 绝对目录
//				cfg.setDirectoryForTemplateLoading(new File(SDKController.class.getResource("/templates").getPath()));
				// src/main/resource目录
				cfg.setClassForTemplateLoading(FreemarkerUtils.class.getClass(),"/templates/codegen");
//				cfg.setServletContextForTemplateLoading(ServletActionContext.getServletContext(), "/WEB-INF/templates");
			} catch (Exception e) {
				e.printStackTrace();
			}
			// setEncoding这个方法一定要设置国家及其编码，不然在flt中的中文在生成html后会变成乱码
			cfg.setEncoding(Locale.getDefault(), "UTF-8");

			// 设置对象的包装器
			cfg.setObjectWrapper(new DefaultObjectWrapper());
			// 设置异常处理器//这样的话就可以${a.b.c.d}即使没有属性也不会出错
			cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);

		}
		return cfg;
	}

	/**
	 * @param templateName
	 *            模板名字
	 * @param model
	 *            模板根 用于在模板内输出结果集
	 * @param out
	 *            输出对象 具体输出到哪里
	 */
	public static void processTemplate(String templateName,
			Map<String, Object> model, Writer out) {
		try {
			// Writer out = new BufferedWriter(new OutputStreamWriter(new
			// FileOutputStream(targetFile), "UTF-8"));
			cfg = FreemarkerUtils.getConfiguration();
			// 获得模板
			Template template = cfg.getTemplate(templateName, "utf-8");
			template.process(model, out);
			out.flush();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (TemplateException e) {
			e.printStackTrace();
		} finally {
			try {
				out.close();
				out = null;
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * @param templateName
	 *            模板名字
	 * @param model
	 *            模板根 用于在模板内输出结果集
	 * @param targetFile
	 *            输出对象 具体输出到哪里
	 */
	public static void processTemplate(String templateName,
			Map<String, Object> model, String targetFile ) {
		Writer out = null;
		try {
			 out = new BufferedWriter(new OutputStreamWriter(new
			 FileOutputStream(targetFile), "UTF-8"));
			cfg = FreemarkerUtils.getConfiguration();
			// 获得模板
			Template template = cfg.getTemplate(templateName, "utf-8");
			template.process(model, out);
			out.flush();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (TemplateException e) {
			e.printStackTrace();
		} finally {
			try {
				out.close();
				out = null;
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * @param templateName
	 *            模板名字
	 * @param model
	 *            模板根 用于在模板内输出结果集
	 */
	public static String processTemplate(String templateName,
			Map<String, Object> model) {
		StringWriter out = new StringWriter();
		String htmlStr = "";
		try {
			cfg = FreemarkerUtils.getConfiguration();
			// 获得模板
			Template template = cfg.getTemplate(templateName, "utf-8");
			// 生成文件（这里是我们是生成html）
			template.process(model, out);
			htmlStr = out.toString();
			out.flush();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (TemplateException e) {
			e.printStackTrace();
		} finally {
			try {
				out.close();
				out = null;
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return htmlStr;
	}

	public static String process(String template, Map<String, Object> model,
			Configuration configuration) {
		if (template == null) {
			return null;
		}
		if (configuration == null) {
			configuration = new Configuration();
		}
		StringWriter writer = new StringWriter();
		String htmlStr = "";
		try {
			new Template("template", new StringReader(template), configuration)
					.process(model, writer);
			htmlStr = writer.toString();
			writer.flush();
		} catch (TemplateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				writer.close();
				writer = null;
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return htmlStr;
	}

}
